package com.ccp.dev.workflow.listener;

import com.ccp.dev.core.util.AppUtil;
import com.ccp.dev.workflow.bpmconst.BpmConst;
import com.ccp.dev.workflow.service.BpmProStatusService;
import com.ccp.dev.workflow.service.bpm.thread.TaskThreadService;
import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * ClassDescribe:
 * 外部子流程节点启动事件监听器。
 * <pre>
 * 1.	子流程执行顺序。
 *  	1.流程流转到外部子流程节点。
 *  	2.首先执行节点开始监听器，CallSubProcessStartListener。
 *  	3.再触发子流程的开始监听事件。
 *  	4.子流程执行完毕，会触发结束监听事件。
 *  	5.触发子流程节点结束监听器。
 * 	2.起始节点事件做的操作。
 * 		1.构造外部子流程变量 【outPassVars】 ，用于外部子流程和内部子流程做数据传递。
 * 		2.清除之前的堆栈任务。
 * 		3.清除之前子流程产生的子流程流程实例id列表。
 * 		4.修改子流程节点的状态为正在运行。
 * </pre>
 * @author :wangcheng
 * Date: 2019-05-13
 */
@Component
@SuppressWarnings("serial")
public class CallSubProcessStartListener extends BaseNodeEventListener{

    @Override
    protected void execute(DelegateExecution execution, String procDefId, String nodeId) {
        String processInstanceId = execution.getProcessInstanceId();
        Map<String, Object> flowVars = TaskThreadService.getVariables();

        // 添加父流程定义id
        flowVars.put(BpmConst.FLOW_PARENT_PROCDEFID, procDefId);
        execution.setVariable(BpmConst.PROCESS_EXT_VARNAME, flowVars);

        Integer completeInstance=(Integer)execution.getVariable("nrOfCompletedInstances");

        //首次调用。
        if(completeInstance==null){
            BpmProStatusService bpmProStatusService= AppUtil.getBean(BpmProStatusService.class);
            TaskThreadService.clearNewTasks();
            TaskThreadService.cleanExtSubProcess();
            bpmProStatusService.addOrUpd(procDefId, processInstanceId, nodeId);
        }
    }

    @Override
    protected Integer getScriptType() {
        return BpmConst.START_SCRIPT;
    }

}
